#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <stdint.h>

#pragma pack(push, 1)
typedef struct {
    uint16_t type;              // 文件标识 'BM'
    uint32_t size;              // 文件大小
    uint16_t reserved1;
    uint16_t reserved2;
    uint32_t offset;            // 数据偏移
    uint32_t dib_size;          // DIB头大小
    int32_t  width;             // 图像宽度
    int32_t  height;            // 图像高度（正值为倒序）
    uint16_t planes;
    uint16_t bpp;               // 像素位数（24）
    // 省略其他字段...
} BMPHeader;
#pragma pack(pop)

int main(int argc, char *argv[]) {
    // 打开帧缓冲设备
    int fbfd = open("/dev/fb0", O_RDWR);
    if (fbfd == -1) {
        perror("帧缓冲设备打开失败");
        return 1;
    }

    // 获取屏幕信息
    struct fb_var_screeninfo vinfo;
    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
        perror("获取屏幕信息失败");
        close(fbfd);
        return 1;
    }

    // 内存映射
    size_t fb_size = vinfo.xres * vinfo.yres * (vinfo.bits_per_pixel / 8);
    char *fbp = mmap(NULL, fb_size, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
    if (fbp == MAP_FAILED) {
        perror("内存映射失败");
        close(fbfd);
        return 1;
    }

    // Open BMP file
    const char *filename = "/home/fzj/123";  // Default value

    if (argc > 1) {
        filename = argv[1];  // Use command-line argument if provided
    }

    int bmp_fd = open(filename, O_RDONLY);
    if (bmp_fd == -1) {
        perror("BMP文件打开失败");
        munmap(fbp, fb_size);
        close(fbfd);
        return 1;
    }

    // Rest of the code remains unchanged...
}